Load code

Variables

Load data

Filter data

success

Single lemma

Load data

Check tweets

tweets %>%
  select(tweet, date) %>%
  # slice(., sample(1:n())) #random selection
  arrange(date)

Check uses and edges

df_comp %>%
  filter(LEMMA == 'hyperlocal') %>%
  select(LEMMA, USES_TOT, SUBSET, USES)

Case studies

Data overview

Usage frequency

Overall across cases

df_comp %>%
  filter(
    LEMMA %in% cases,
    SUBSET == 'full'
    ) %>%
   arrange(desc(USES_TOT))

Uses in first subset

df_comp %>%
  filter(
    SUBSETTING == 'time',
    SUBSET == 'one'
    ) %>%
  select(LEMMA, USES_TOT, USES) %>%
  arrange(USES)

Degree centralization

Diachronic

plt <- df_comp %>%
  select(LEMMA, SUBSETTING, SUBSET, CENT_DEGREE, CENT_EV) %>%
  filter(
    SUBSET != 'full',
    LEMMA %in% cases
    # LEMMA %in% c(cases, 'hyperlocal', 'blockchain', 'climate denial', 'man bun', 'upskill', 'deep learning')
    # overtourism: diff too big for case study scale; 
    # , 'broflake', 'climate crisis', 'incel', 'overtourism'
  ) %>%
  ggplot(., aes(x=SUBSET, y=CENT_DEGREE)) + # group=1
    geom_point(aes(group=LEMMA, color=LEMMA, shape=LEMMA)) +
    geom_line(aes(group=LEMMA, color=LEMMA, linetype=LEMMA)) +
    guides(group=TRUE) +
    ggtitle('Diffusion over time: changes in degree centralization') +
    scale_y_continuous('degree centrality') +
    scale_x_discrete('subset')

ggplotly(plt)

# ggsave('out/cases_cent_diac.pdf', width=6, height=4)

Overall

df_comp %>%
  filter(
    LEMMA %in% cases,
    SUBSET == 'full'
    ) %>%
  select(
    LEMMA, 
    EDGES,
    CENT_DEGREE, 
    CENT_EV
    ) %>%
  arrange((CENT_DEGREE))

Full sample

Usage intensity

df_comp %>%
  filter(SUBSET == 'full') %>%
  arrange(desc(USES))

Edges

Degree centrality

Overall

List

df_comp %>%
  select(LEMMA, SUBSET, USES_TOT, CENT_DEGREE, CENT_EV) %>%
  filter(
    SUBSET == 'full'
    # USES >= 2
    ) %>%
  arrange(
    (CENT_DEGREE)
    # desc(CENT_EV)
  )

Plot

plt <- df_comp %>%
  select(LEMMA, SUBSET, USES, CENT_DEGREE) %>%
  filter(SUBSET == 'full') %>%
  arrange((CENT_DEGREE)) %>%
  ggplot(., aes(x=CENT_DEGREE, y=reorder(LEMMA, CENT_DEGREE))) +
    geom_point() +
    scale_y_discrete('lemmas') +
    scale_x_continuous(
      'degree centralization (log)',
      trans='log'
      )

plt


# ggsave('out/cent_sync_all.pdf', width=6, height=4)

Over time

Across all lemmas

df_comp %>%
  filter(
    SUBSET %in% c('one', 'two', 'three', 'four'),
    LEMMA %in% successful_diffs
    # USES_TOT >= 10000
    # USES > 10000
    ) %>%
  group_by(SUBSET) %>%
  summarize(CENT_AVG = mean(CENT_DEGREE)) %>%
  ggplot(., aes(x=SUBSET, y=CENT_AVG, group=1)) +
    geom_line() +
    geom_point() +
    scale_y_continuous('degree centralization') +
    scale_x_discrete('subsets')


# ggsave('out/full_cent_diac.pdf', width=6, height=4)

Biggest changes

df_comp %>%
  select(LEMMA, SUBSET, CENT_DEGREE, EDGES, USES_TOT) %>%
  filter(
    SUBSET %in% c(
      'one', 
      'four'
      ),
    USES_TOT >= 10000
    ) %>%
  dplyr::group_by(LEMMA) %>%
  dplyr::mutate(CENT_DIFF = CENT_DEGREE - lag(CENT_DEGREE, default=CENT_DEGREE[1])) %>%
  drop_na() %>%
  select(-SUBSET) %>%
  rename(
    CENT_LAST = CENT_DEGREE,
    EDGES_LAST = EDGES
    ) %>%
  arrange((CENT_DIFF))

Frequency vs. networks

Frequency vs. centralization

Plot

plt <- df_comp %>%
  filter(
    SUBSET == 'four',
    # USES_TOT %in% (150000:500000)
    # LEMMA %in% c(cases)
    # !LEMMA %in% c('slut shaming', 'dashcam', 'shareable', 'cuckold', 'deep learning', 'hyperlocal')
    ) %>%
  select(LEMMA, CENT_DEGREE, USES_TOT, USES, EDGES) %>%
  ggplot(., aes(x=CENT_DEGREE, y=USES_TOT)) +
    geom_text(aes(label=LEMMA), hjust=-0.1, vjust=-0.1) + 
    # geom_point() +
    scale_y_continuous(
      'usage frequency (log)', 
      trans='log'
      ) +
    scale_x_continuous(
      'degree centralization'
      # trans='log'
      )

ggplotly(plt)

# ggsave('out/full_cent_freq_overall.pdf', width=6, height=4)
# ggsave('out/cases_cent_freq_overall.pdf', width=6, height=4)

Biggest discrepancies

df_comp %>%
  filter(
    SUBSETTING == 'time',
    SUBSET == 'four'
    ) %>%
  select(LEMMA, USES_TOT, CENT_DEGREE) %>%
  mutate(DISC = USES_TOT / CENT_DEGREE) %>%
  arrange(DISC)

Correlation

df_corr <- df_comp %>%
  filter(
    # SUBSET != 'full'
    # EDGES >= 100
    ) %>%
  select(-c(LEMMA, SUBSET, START, END, SKIP, STAMP))
  
cor.test(df_corr$USES, df_corr$CENT_DEGREE)

    Pearson's product-moment correlation

data:  df_corr$USES and df_corr$CENT_DEGREE
t = -2.3949, df = 517, p-value = 0.01698
alternative hypothesis: true correlation is not equal to 0
95 percent confidence interval:
 -0.18911153 -0.01884815
sample estimates:
       cor 
-0.1047473 

Coefficient of variation

df_comp %>%
  filter(
    SUBSET == 'full',
    USES_TOT >= 1000
    ) %>%
  select(LEMMA, USES_TOT, COEF_VAR) %>%
  arrange(desc(COEF_VAR))

Processing status

Lemma list

df_comp %>%
  select(LEMMA, SUBSET, STAMP) %>%
  filter(SUBSET == 'four') %>%
  # mutate(STAMP = as_datetime(STAMP)) %>%
  arrange(desc(STAMP))

Dataset statistics

df_comp %>%
  filter(SUBSET == 'full') %>%
  select(LEMMA, SUBSET, USES_TOT, USERS_TOT) %>%
  dplyr::summarise(
    USES_ALL = sum(USES_TOT),
    USERS_ALL = sum(USERS_TOT)
    )
LS0tCmF1dGhvcjogJ1F1aXJpbiBXw7xyc2NoaW5nZXInCnRpdGxlOiAiU29jaWFsIG5ldHdvcmtzIG9mIGxleGljYWwgaW5ub3ZhdGlvbiIKb3V0cHV0OiAKICBodG1sX25vdGVib29rOiAKICAgIHRvYzogeWVzCi0tLQoKIyBMb2FkIGNvZGUKCmBgYHtyIGluY2x1ZGU9RkFMU0V9CnNvdXJjZSgnc3JjL2xvYWQtZGF0YS5SJykKc291cmNlKCdzcmMvcG9zdHByb2MuUicpCnNvdXJjZSgnc3JjL3VzZXMuUicpCnNvdXJjZSgnc3JjL3VzZXJzLlInKQpzb3VyY2UoJ3NyYy9zbmEuUicpCgpsaWJyYXJ5KGNvcnJyKQpsaWJyYXJ5KHRpZHlyKQpsaWJyYXJ5KG1hZ3JpdHRyKQpgYGAKCgojIFZhcmlhYmxlcwoKYGBge3IgaW5jbHVkZT1GQUxTRX0Kc3Vic2V0dGluZyA9ICd0aW1lJwpkaWZmX3N0YXJ0X21ldGhvZCA8LSAnZWRnZXMnCmRpZmZfc3RhcnRfbGltaXQgPC0gMwoKY2FzZXMgPC0gYygKICAnZ2hvc3RpbmcnLCAKICAnbGl0dWF0aW9uJywgCiAgJ2FsdC1sZWZ0JywgCiAgJ3NvbG9wcmVuZXVyJywKICAnaHlwZXJsb2NhbCcsCiAgJ3VwY3ljbGluZycKICApCgpgYGAKCgojIExvYWQgZGF0YQoKYGBge3IgaW5jbHVkZT1GQUxTRX0KaWYgKGV4aXN0cygnZGZfY29tcCcpID09IEZBTFNFKSB7CiAgZGZfY29tcCA8LSByZWFkX2RmX2NvbXAoZl9wYXRoPSdvdXQvZGZfY29tcC5jc3YnKQp9CmBgYAoKCiMgRmlsdGVyIGRhdGEKCmBgYHtyIGluY2x1ZGU9RkFMU0V9CmRmX2NvbXAgJTw+JSAKICBmaWx0ZXIoCiAgICBTS0lQICE9IFRSVUUsCiAgICBTVUJTRVRUSU5HID09IHN1YnNldHRpbmcsCiAgICAjIGVzdGFibGlzaGVkIHdvcmRzCiAgICAhTEVNTUEgJWluJSBjKCdBbmdsby1TYXhvbicsICdjbGltYXRlIGNyaXNpcycsICdnbG9iYWwgaGVhdGluZycsICdncmVlbndhc2hpbmcnLCAncG9saXRpY2FsIGNvcnJlY3RuZXNzJywgJ3JlZnVnZWUgY3Jpc2lzICcpCiAgICAjIHN1Y2Nlc3NmdWwgd29yZHM6IFVTRVNfVE9UID49IDEwMDAwCiAgICAjIHVuc3VjY2Vzc2Z1bCB3b3JkczogVVNFU19UT1QgPD0gMTAwMDAKICAgICMgd2VpcmQgd29yZHM6IGJpZyBkaWNrIGVuZXJneQogICkKYGBgCgoKIyMgc3VjY2VzcwoKYGBge3J9CmRmX2NvbXAgJT4lCiAgc2VsZWN0KExFTU1BLCBTVUJTRVQsIFVTRVMsIENFTlRfREVHUkVFKSAlPiUKICBmaWx0ZXIoU1VCU0VUICE9ICdmdWxsJykgJT4lCiAgZ3JvdXBfYnkoTEVNTUEpICU+JQogIG11dGF0ZShESUZGX1VTRVMgPSBVU0VTIC0gbGFnKFVTRVMpKSAlPiUKICBtdXRhdGUoRElGRl9VU0VTX1RPVCA9IHN1bShESUZGX1VTRVMsIG5hLnJtPVRSVUUpKSAlPiUKICBmaWx0ZXIoU1VCU0VUID09ICdmb3VyJykgJT4lCiAgYXJyYW5nZShESUZGX1VTRVNfVE9UKQoKc3VjY2Vzc2Z1bF9kaWZmcyA8LSBkZl9zdWNjZXNzICU+JQogIGZpbHRlcihESUZGX1VTRVNfVE9UID4gMCkgJT4lCiAgcHVsbChMRU1NQSkKCnVuc3VjY2Vzc2Z1bF9kaWZmcyA8LSBkZl9zdWNjZXNzICU+JQogIGZpbHRlcihESUZGX1VTRVNfVE9UIDwgMCkgJT4lCiAgcHVsbChMRU1NQSkKCnN1Y2Nlc3NmdWxfdXNlc19taW4gPC0gZGZfY29tcCAlPiUKICBmaWx0ZXIoVVNFUyA+IDEwMDApICU+JQogIHB1bGwoTEVNTUEpCiAgCiAgCnVuc3VjY2Vzc2Z1bF91c2VzX21pbiA8LSBkZl9jb21wICU+JQogIGZpbHRlcihVU0VTIDwgMTAwMCkgJT4lCiAgcHVsbChMRU1NQSkKYGBgCgoKIyBTaW5nbGUgbGVtbWEKCiMjIExvYWQgZGF0YQoKYGBge3IgaW5jbHVkZT1GQUxTRX0KY29ycHVzIDwtICcvVm9sdW1lcy9xamQvdHdpbnQvJwpsZW1tYSA8LSAnYmlnIGRpY2sgZW5lcmd5JwoKdHdlZXRzIDwtIGxvYWRfZGF0YShjb3JwdXMsIGxlbW1hKQp0d2VldHMgPC0gcG9zdHByb2ModHdlZXRzKQp0d2VldHMgPC0gZmlsdGVyX3R3ZWV0cyh0d2VldHMpCmBgYAoKCiMjIENoZWNrIHR3ZWV0cwoKYGBge3J9CnR3ZWV0cyAlPiUKICBzZWxlY3QodHdlZXQsIGRhdGUpICU+JQogICMgc2xpY2UoLiwgc2FtcGxlKDE6bigpKSkgI3JhbmRvbSBzZWxlY3Rpb24KICBhcnJhbmdlKGRhdGUpCmBgYAoKCiMjIENoZWNrIHVzZXMgYW5kIGVkZ2VzCgpgYGB7cn0KZGZfY29tcCAlPiUKICBmaWx0ZXIoTEVNTUEgPT0gJ2h5cGVybG9jYWwnKSAlPiUKICBzZWxlY3QoTEVNTUEsIFVTRVNfVE9ULCBTVUJTRVQsIFVTRVMpCmBgYAoKCiMgQ2FzZSBzdHVkaWVzCgojIyBEYXRhIG92ZXJ2aWV3CgpgYGB7ciBpbmNsdWRlPUZBTFNFfQpkZl9jb21wICU+JQogIGZpbHRlcigKICAgIExFTU1BICVpbiUgY2FzZXMsCiAgICBTVUJTRVQgPT0gJ2Z1bGwnCiAgICApICU+JQogIHNlbGVjdChMRU1NQSwgVVNFUz1VU0VTX1RPVCwgU1BFQUtFUlM9VVNFUlNfVE9UKSAlPiUKICBtdXRhdGUoVVNFU19QRVJfU1BFQUtFUiA9IFVTRVMgLyBTUEVBS0VSUykgJT4lCiAgYXJyYW5nZShkZXNjKFVTRVMpKQogICMgZ2dwbG90KGRhdGE9LiwgYWVzKHg9VVNFUlNfVE9ULCB5PVVTRVNfVE9UKSkgKwogICMgICBnZW9tX3RleHQoYWVzKGxhYmVsPUxFTU1BKSkgKwogICMgICBzY2FsZV95X2NvbnRpbnVvdXMoJ2ZyZXF1ZW5jeSAobG9nKScsIHRyYW5zPSdsb2cnKQpgYGAKCgojIyBVc2FnZSBmcmVxdWVuY3kKCiMjIyBPdmVyYWxsIGFjcm9zcyBjYXNlcwoKYGBge3J9CmRmX2NvbXAgJT4lCiAgZmlsdGVyKAogICAgTEVNTUEgJWluJSBjYXNlcywKICAgIFNVQlNFVCA9PSAnZnVsbCcKICAgICkgJT4lCiAgIGFycmFuZ2UoZGVzYyhVU0VTX1RPVCkpCmBgYAoKCiMjIyBVc2VzIGluIGZpcnN0IHN1YnNldAoKYGBge3J9CmRmX2NvbXAgJT4lCiAgZmlsdGVyKAogICAgU1VCU0VUVElORyA9PSAndGltZScsCiAgICBTVUJTRVQgPT0gJ29uZScKICAgICkgJT4lCiAgc2VsZWN0KExFTU1BLCBVU0VTX1RPVCwgVVNFUykgJT4lCiAgYXJyYW5nZShVU0VTKQpgYGAKCgoKIyMgRGVncmVlIGNlbnRyYWxpemF0aW9uCgojIyMgRGlhY2hyb25pYwoKYGBge3J9CnBsdCA8LSBkZl9jb21wICU+JQogIHNlbGVjdChMRU1NQSwgU1VCU0VUVElORywgU1VCU0VULCBDRU5UX0RFR1JFRSwgQ0VOVF9FVikgJT4lCiAgZmlsdGVyKAogICAgU1VCU0VUICE9ICdmdWxsJywKICAgIExFTU1BICVpbiUgY2FzZXMKICAgICMgTEVNTUEgJWluJSBjKGNhc2VzLCAnaHlwZXJsb2NhbCcsICdibG9ja2NoYWluJywgJ2NsaW1hdGUgZGVuaWFsJywgJ21hbiBidW4nLCAndXBza2lsbCcsICdkZWVwIGxlYXJuaW5nJykKICAgICMgb3ZlcnRvdXJpc206IGRpZmYgdG9vIGJpZyBmb3IgY2FzZSBzdHVkeSBzY2FsZTsgCiAgICAjICwgJ2Jyb2ZsYWtlJywgJ2NsaW1hdGUgY3Jpc2lzJywgJ2luY2VsJywgJ292ZXJ0b3VyaXNtJwogICkgJT4lCiAgZ2dwbG90KC4sIGFlcyh4PVNVQlNFVCwgeT1DRU5UX0RFR1JFRSkpICsgIyBncm91cD0xCiAgICBnZW9tX3BvaW50KGFlcyhncm91cD1MRU1NQSwgY29sb3I9TEVNTUEsIHNoYXBlPUxFTU1BKSkgKwogICAgZ2VvbV9saW5lKGFlcyhncm91cD1MRU1NQSwgY29sb3I9TEVNTUEsIGxpbmV0eXBlPUxFTU1BKSkgKwogICAgZ3VpZGVzKGdyb3VwPVRSVUUpICsKICAgIGdndGl0bGUoJ0RpZmZ1c2lvbiBvdmVyIHRpbWU6IGNoYW5nZXMgaW4gZGVncmVlIGNlbnRyYWxpemF0aW9uJykgKwogICAgc2NhbGVfeV9jb250aW51b3VzKCdkZWdyZWUgY2VudHJhbGl0eScpICsKICAgIHNjYWxlX3hfZGlzY3JldGUoJ3N1YnNldCcpCgpnZ3Bsb3RseShwbHQpCiMgZ2dzYXZlKCdvdXQvY2FzZXNfY2VudF9kaWFjLnBkZicsIHdpZHRoPTYsIGhlaWdodD00KQpgYGAKCgojIyMgT3ZlcmFsbAoKYGBge3J9CmRmX2NvbXAgJT4lCiAgZmlsdGVyKAogICAgTEVNTUEgJWluJSBjYXNlcywKICAgIFNVQlNFVCA9PSAnZnVsbCcKICAgICkgJT4lCiAgc2VsZWN0KAogICAgTEVNTUEsIAogICAgRURHRVMsCiAgICBDRU5UX0RFR1JFRSwgCiAgICBDRU5UX0VWCiAgICApICU+JQogIGFycmFuZ2UoKENFTlRfREVHUkVFKSkKYGBgCgoKIyBGdWxsIHNhbXBsZQoKIyMgVXNhZ2UgaW50ZW5zaXR5CgpgYGB7cn0KZGZfY29tcCAlPiUKICBmaWx0ZXIoU1VCU0VUID09ICdmdWxsJykgJT4lCiAgYXJyYW5nZShkZXNjKFVTRVMpKQpgYGAKCgojIyBFZGdlcwoKYGBge3IgaW5jbHVkZT1GQUxTRX0KZGZfY29tcCAlPiUKICBkcGx5cjo6Z3JvdXBfYnkoTEVNTUEpICU+JQogIGZpbHRlcihTVUJTRVQgPT0gJ29uZScpICU+JQogIHNlbGVjdChMRU1NQSwgU1VCU0VULCBVU0VTLCBFREdFUykgJT4lCiAgYXJyYW5nZShFREdFUykKYGBgCgoKIyMgRGVncmVlIGNlbnRyYWxpdHkKCiMjIyBPdmVyYWxsCgojIyMjIExpc3QKCmBgYHtyfQpkZl9jb21wICU+JQogIHNlbGVjdChMRU1NQSwgU1VCU0VULCBVU0VTX1RPVCwgQ0VOVF9ERUdSRUUsIENFTlRfRVYpICU+JQogIGZpbHRlcigKICAgIFNVQlNFVCA9PSAnZnVsbCcKICAgICMgVVNFUyA+PSAyCiAgICApICU+JQogIGFycmFuZ2UoCiAgICAoQ0VOVF9ERUdSRUUpCiAgICAjIGRlc2MoQ0VOVF9FVikKICApCmBgYAoKCiMjIyMgUGxvdAoKYGBge3J9CnBsdCA8LSBkZl9jb21wICU+JQogIHNlbGVjdChMRU1NQSwgU1VCU0VULCBVU0VTLCBDRU5UX0RFR1JFRSkgJT4lCiAgZmlsdGVyKFNVQlNFVCA9PSAnZnVsbCcpICU+JQogIGFycmFuZ2UoKENFTlRfREVHUkVFKSkgJT4lCiAgZ2dwbG90KC4sIGFlcyh4PUNFTlRfREVHUkVFLCB5PXJlb3JkZXIoTEVNTUEsIENFTlRfREVHUkVFKSkpICsKICAgIGdlb21fcG9pbnQoKSArCiAgICBzY2FsZV95X2Rpc2NyZXRlKCdsZW1tYXMnKSArCiAgICBzY2FsZV94X2NvbnRpbnVvdXMoCiAgICAgICdkZWdyZWUgY2VudHJhbGl6YXRpb24gKGxvZyknLAogICAgICB0cmFucz0nbG9nJwogICAgICApCgpwbHQKCiMgZ2dzYXZlKCdvdXQvY2VudF9zeW5jX2FsbC5wZGYnLCB3aWR0aD02LCBoZWlnaHQ9NCkKYGBgCgoKIyMjIE92ZXIgdGltZQoKIyMjIyBBY3Jvc3MgYWxsIGxlbW1hcwoKYGBge3J9CmRmX2NvbXAgJT4lCiAgZmlsdGVyKAogICAgU1VCU0VUICVpbiUgYygnb25lJywgJ3R3bycsICd0aHJlZScsICdmb3VyJyksCiAgICBMRU1NQSAlaW4lIHN1Y2Nlc3NmdWxfZGlmZnMKICAgICMgVVNFU19UT1QgPj0gMTAwMDAKICAgICMgVVNFUyA+IDEwMDAwCiAgICApICU+JQogIGdyb3VwX2J5KFNVQlNFVCkgJT4lCiAgc3VtbWFyaXplKENFTlRfQVZHID0gbWVhbihDRU5UX0RFR1JFRSkpICU+JQogIGdncGxvdCguLCBhZXMoeD1TVUJTRVQsIHk9Q0VOVF9BVkcsIGdyb3VwPTEpKSArCiAgICBnZW9tX2xpbmUoKSArCiAgICBnZW9tX3BvaW50KCkgKwogICAgc2NhbGVfeV9jb250aW51b3VzKCdkZWdyZWUgY2VudHJhbGl6YXRpb24nKSArCiAgICBzY2FsZV94X2Rpc2NyZXRlKCdzdWJzZXRzJykKCiMgZ2dzYXZlKCdvdXQvZnVsbF9jZW50X2RpYWMucGRmJywgd2lkdGg9NiwgaGVpZ2h0PTQpCmBgYAoKCiMjIyMgQmlnZ2VzdCBjaGFuZ2VzCgpgYGB7cn0KZGZfY29tcCAlPiUKICBzZWxlY3QoTEVNTUEsIFNVQlNFVCwgQ0VOVF9ERUdSRUUsIEVER0VTLCBVU0VTX1RPVCkgJT4lCiAgZmlsdGVyKAogICAgU1VCU0VUICVpbiUgYygKICAgICAgJ29uZScsIAogICAgICAnZm91cicKICAgICAgKSwKICAgIFVTRVNfVE9UID49IDEwMDAwCiAgICApICU+JQogIGRwbHlyOjpncm91cF9ieShMRU1NQSkgJT4lCiAgZHBseXI6Om11dGF0ZShDRU5UX0RJRkYgPSBDRU5UX0RFR1JFRSAtIGxhZyhDRU5UX0RFR1JFRSwgZGVmYXVsdD1DRU5UX0RFR1JFRVsxXSkpICU+JQogIGRyb3BfbmEoKSAlPiUKICBzZWxlY3QoLVNVQlNFVCkgJT4lCiAgcmVuYW1lKAogICAgQ0VOVF9MQVNUID0gQ0VOVF9ERUdSRUUsCiAgICBFREdFU19MQVNUID0gRURHRVMKICAgICkgJT4lCiAgYXJyYW5nZSgoQ0VOVF9ESUZGKSkKYGBgCgoKIyBGcmVxdWVuY3kgdnMuIG5ldHdvcmtzCgojIyBGcmVxdWVuY3kgdnMuIGNlbnRyYWxpemF0aW9uCgojIyMgUGxvdAoKYGBge3J9CnBsdCA8LSBkZl9jb21wICU+JQogIGZpbHRlcigKICAgIFNVQlNFVCA9PSAnZm91cicsCiAgICAjIFVTRVNfVE9UICVpbiUgKDE1MDAwMDo1MDAwMDApCiAgICAjIExFTU1BICVpbiUgYyhjYXNlcykKICAgICMgIUxFTU1BICVpbiUgYygnc2x1dCBzaGFtaW5nJywgJ2Rhc2hjYW0nLCAnc2hhcmVhYmxlJywgJ2N1Y2tvbGQnLCAnZGVlcCBsZWFybmluZycsICdoeXBlcmxvY2FsJykKICAgICkgJT4lCiAgc2VsZWN0KExFTU1BLCBDRU5UX0RFR1JFRSwgVVNFU19UT1QsIFVTRVMsIEVER0VTKSAlPiUKICBnZ3Bsb3QoLiwgYWVzKHg9Q0VOVF9ERUdSRUUsIHk9VVNFU19UT1QpKSArCiAgICBnZW9tX3RleHQoYWVzKGxhYmVsPUxFTU1BKSwgaGp1c3Q9LTAuMSwgdmp1c3Q9LTAuMSkgKyAKICAgICMgZ2VvbV9wb2ludCgpICsKICAgIHNjYWxlX3lfY29udGludW91cygKICAgICAgJ3VzYWdlIGZyZXF1ZW5jeSAobG9nKScsIAogICAgICB0cmFucz0nbG9nJwogICAgICApICsKICAgIHNjYWxlX3hfY29udGludW91cygKICAgICAgJ2RlZ3JlZSBjZW50cmFsaXphdGlvbicKICAgICAgIyB0cmFucz0nbG9nJwogICAgICApCgpnZ3Bsb3RseShwbHQpCiMgZ2dzYXZlKCdvdXQvZnVsbF9jZW50X2ZyZXFfb3ZlcmFsbC5wZGYnLCB3aWR0aD02LCBoZWlnaHQ9NCkKIyBnZ3NhdmUoJ291dC9jYXNlc19jZW50X2ZyZXFfb3ZlcmFsbC5wZGYnLCB3aWR0aD02LCBoZWlnaHQ9NCkKYGBgCgoKIyMjIEJpZ2dlc3QgZGlzY3JlcGFuY2llcwoKYGBge3J9CmRmX2NvbXAgJT4lCiAgZmlsdGVyKAogICAgU1VCU0VUVElORyA9PSAndGltZScsCiAgICBTVUJTRVQgPT0gJ2ZvdXInCiAgICApICU+JQogIHNlbGVjdChMRU1NQSwgVVNFU19UT1QsIENFTlRfREVHUkVFKSAlPiUKICBtdXRhdGUoRElTQyA9IFVTRVNfVE9UIC8gQ0VOVF9ERUdSRUUpICU+JQogIGFycmFuZ2UoRElTQykKYGBgCgoKIyMjIENvcnJlbGF0aW9uCgpgYGB7cn0KZGZfY29yciA8LSBkZl9jb21wICU+JQogIGZpbHRlcigKICAgICMgU1VCU0VUICE9ICdmdWxsJwogICAgIyBFREdFUyA+PSAxMDAKICAgICkgJT4lCiAgc2VsZWN0KC1jKExFTU1BLCBTVUJTRVQsIFNUQVJULCBFTkQsIFNLSVAsIFNUQU1QKSkKICAKY29yLnRlc3QoZGZfY29yciRVU0VTLCBkZl9jb3JyJENFTlRfREVHUkVFKQpgYGAKCgojIENvZWZmaWNpZW50IG9mIHZhcmlhdGlvbgoKYGBge3J9CmRmX2NvbXAgJT4lCiAgZmlsdGVyKAogICAgU1VCU0VUID09ICdmdWxsJywKICAgIFVTRVNfVE9UID49IDEwMDAKICAgICkgJT4lCiAgc2VsZWN0KExFTU1BLCBVU0VTX1RPVCwgQ09FRl9WQVIpICU+JQogIGFycmFuZ2UoZGVzYyhDT0VGX1ZBUikpCmBgYAoKCiMgUHJvY2Vzc2luZyBzdGF0dXMKCiMjIExlbW1hIGxpc3QKCmBgYHtyfQpkZl9jb21wICU+JQogIHNlbGVjdChMRU1NQSwgU1VCU0VULCBTVEFNUCkgJT4lCiAgZmlsdGVyKFNVQlNFVCA9PSAnZm91cicpICU+JQogICMgbXV0YXRlKFNUQU1QID0gYXNfZGF0ZXRpbWUoU1RBTVApKSAlPiUKICBhcnJhbmdlKGRlc2MoU1RBTVApKQpgYGAKCgojIyBEYXRhc2V0IHN0YXRpc3RpY3MKCmBgYHtyfQpkZl9jb21wICU+JQogIGZpbHRlcihTVUJTRVQgPT0gJ2Z1bGwnKSAlPiUKICBzZWxlY3QoTEVNTUEsIFNVQlNFVCwgVVNFU19UT1QsIFVTRVJTX1RPVCkgJT4lCiAgZHBseXI6OnN1bW1hcmlzZSgKICAgIFVTRVNfQUxMID0gc3VtKFVTRVNfVE9UKSwKICAgIFVTRVJTX0FMTCA9IHN1bShVU0VSU19UT1QpCiAgICApCmBgYA==